package com.ljk.service.impl;

import com.ljk.dao.ExampleDao;
import com.ljk.entity.User;
import com.ljk.mapper.SampleMapper;
import com.ljk.service.ExampleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 业务层（Service 层）实现类
 * <p>
 * {@link Service} (通常作用在业务层（Service 层），用于将业务层的类标识为 Spring 中的 Bean，其功能与 @Component 相同。)
 *
 * @author leng
 * @date 2020/6/18 23:55
 */
@Service
public class ExampleServiceImpl implements ExampleService {
    /**
     * Dao层注入推荐方式
     * <p>
     * {@link Resource} (其作用与 Autowired 一样。其区别在于 @Autowired 默认按照 Bean 类型装配，而 @Resource 默认按照 Bean 实例名称进行装配。)
     *
     * @Resource 中有两个重要属性：name 和 type。
     * Spring 将 name 属性解析为 Bean 实例名称，type 属性解析为 Bean 实例类型。如果指定 name 属性，则按实例名称进行装配；如果指定 type 属性，则按 Bean 类型进行装配。
     * 如果都不指定，则先按 Bean 实例名称装配，如果不能匹配，则再按照 Bean 类型进行装配；如果都无法匹配，则抛出 NoSuchBeanDefinitionException 异常。
     * <p>
     * DAO的第二种注入方式就是用 @Autowired,默认按照类型进行装配(可以用但不推荐)
     */
    @Resource
    private ExampleDao exampleDao;
    @Resource
    private SampleMapper sampleMapper;

    private ExampleService exampleService;
    /**
     * Service官方推荐注入方式,也可直接注入到属性上(不推荐)
     * 如你所见service可以互相注入
     * @param exampleService
     */
    @Autowired
    public void setExampleService(ExampleService exampleService) {
        this.exampleService = exampleService;
    }

    @Override
    public void add() {
        System.out.println("示例方法,service层的实现方法add被实现了");
        exampleDao.add();
    }

    @Override
    public void say() {
        System.out.println("示例方法,service层中的互相注入实现方法say被实现了");
        exampleService.add();
    }

    @Override
    public int myBatisTest() {
        return sampleMapper.example();
    }
    @Override
    public User getUser(){
        return sampleMapper.selectUser();
    }
}
